package com.briup.bms.service.impl;

import java.util.Arrays;
import java.util.List;
import java.util.Set;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.ObjectUtils;
import org.springframework.util.StringUtils;

import com.briup.bms.bean.Department;
import com.briup.bms.bean.Region;
import com.briup.bms.common.exceptions.BmsServiceException;
import com.briup.bms.common.utils.Page;
import com.briup.bms.common.utils.ResultCode;
import com.briup.bms.dao.IDepartmentMapper;
import com.briup.bms.dao.IRegionDao;
import com.briup.bms.service.IRegionService;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;

/**
 * @Service 具有双重含义
 * 	1. 表明需要在Spring容器中维护该类型的对象
 *  2. 清楚的表明,该对象属于业务成对象
 * @Component @Controller @RestController @Repository 都会让SPring容器维护他们所在类的对象，但是含义不同。
 * @author guomiao
 */
@Service 
public class RegionServiceImpl implements IRegionService {
	
	@Autowired
	IRegionDao regionDao;
	
	@Autowired
	IDepartmentMapper departMapper;
	
	
	

	/**
	 *
	 */
	@Override
	public void deleteById(Long id) {
		Region region = regionDao.findById(id);
		if(region==null) {
			throw new BmsServiceException(ResultCode.DATA_NOT_EXIST, "区域不存在！");
		}
		/**
		 * 逻辑删除：设置删除位（删除标识符），deleteFlag = 0,没有删除，deleteFlag=1，删除
		 * 物理删除：直接从数据库中删除信息。 解除所有物理关联关系。
		 * 		｛1. 删除关联数据，2.设置所有引用外键为null｝
		 */
		//1. 判断该区域下是否有客户，如果有，将客户信息移交出去。
		//2. 删除区域下部门信息关联。
		//3. 解除该区域下仓库信息的关联。
		//4. 或者如上操作都不做，可以直接提示用户，该区域下有相关数据，请用户自己先选择要做的操作，再执行下一步。
//		List<Department> list = departMapper.finByRegion(id);
//		if(list!=null && !list.isEmpty()) {
//			long[] ids = list.stream().mapToLong(dept->dept.getId()).toArray();
//			throw new BmsServiceException(ResultCode.DATA_EXIST,
//					"【"+id+"】号区域下存在"+Arrays.toString(ids)+"部门！请先处理部门信息！");
//		}
		List<Long> list = departMapper.findDeptIdByRegionId(id);
		if(list!=null && !list.isEmpty()) {
			throw new BmsServiceException(ResultCode.DATA_EXIST, "【"+id+"】号区域下存在"+list+"部门！请先处理部门信息！");
		}
		regionDao.deleteById(id);
	}

	@Override
	public void deleteByBatch(Set<Long> ids) {
		//1. 如果ids中一个值都没有，那么提示前端用户，删除失败。请至少选择一个要删除的内容。
//		if(ids!=null && !ids.isEmpty()) {
//			//2. 如果ids中有数据，直接执行删除。
//		}else {
//			
//		}
		if(ids==null || ids.isEmpty()) {
			throw new BmsServiceException(ResultCode.PARAM_NOT_EXIST, "请至少选择一个要删除的区域！");
		}
		//2. 将和ids所关联的所有的信息解除管理/删除数据(区域相关的数据：部门，员工(经理)，员工，客户，仓库)
		
		//3. 删除ids中所维护的所有的区域信息。
		//regionDao.deleteByBatch(ids);
		for(Long id:ids) {
			this.deleteById(id);
		}
	}

	@Override
	public void save(Region region) {
		if(region==null || ObjectUtils.isEmpty(region.getName())) {
			throw new BmsServiceException(ResultCode.PARAM_NOT_EXIST, "区域名称不能为空！");
		}
		Region r = regionDao.findByName(region.getName());
		if(r!=null) { //区域名称是由唯一值约束的，那么如果根据名字找到了，就不能够再次保存。
			throw new BmsServiceException(ResultCode.DATA_EXIST, "区域名称【"+region.getName()+"】已经存在！");
		}
		regionDao.insert(region);
	}

	@Override
	public void modify(Region region) {
		if(region==null||ObjectUtils.isEmpty(region.getId())) {
			throw new BmsServiceException(ResultCode.PARAM_NOT_EXIST, "请指定要更新的区域！");
		}
		if(ObjectUtils.isEmpty(region.getName())) {
			throw new BmsServiceException(ResultCode.PARAM_NOT_EXIST, "区域名称不能为空！");
		}
		Region r = regionDao.findById(region.getId());
		if(r==null) {
			throw new BmsServiceException(ResultCode.DATA_NOT_EXIST, "要更新的区域不存在！");
		}
		r = regionDao.findByName(region.getName());
		if(r!=null) {
			String msg = "";
			if(r.getId()==region.getId())
				msg = "区域信息没有发生变化！";
			else {
				msg = "区域名称【"+region.getName()+"】已经存在！";
			}
			throw new BmsServiceException(ResultCode.PARAM_NOT_EXIST, msg);
		}
		regionDao.updateById(region);
	}

	@Override
	public void saveOrUpdate(Region region) {
		if(region.getName()==null ||"".equals(region.getName())) {
			throw new BmsServiceException(ResultCode.PARAM_NOT_EXIST, "区域名称不能为空！");
		}	
		Region r = regionDao.findByName(region.getName());
		if(r!=null) {
			String msg = "";
			if(r.getId()==region.getId())
				msg = "区域信息没有发生变化！";
			else {
				msg = "区域名称【"+region.getName()+"】已经存在！";
			}
			throw new BmsServiceException(ResultCode.DATA_EXIST, msg);
		}
		if(region.getId()==null) { //保存
			regionDao.insert(region);
		}else {		//更新
			r = regionDao.findById(region.getId());
			if(r==null) {
				throw new BmsServiceException(ResultCode.DATA_NOT_EXIST, "要更新的区域不存在！");
			}
			regionDao.updateById(region);
		}
	}

	@Override
	public List<Region> findByCondition(int pageNum, int pageSize, String name) {
		//limit begin size
		name = ObjectUtils.isEmpty(name)?name:"%"+name+"%";
		List<Region> list = regionDao.findByCondition((pageNum-1)*pageSize,pageSize,name);
		return list;
	}

	@Override
	public Page<Region> findByPageAndCondition(int pageNum, int pageSize, String name) {
		// TODO Auto-generated method stub
		Page<Region> page = new Page<>(pageNum, pageSize);
		//查找数据库表中符合要求的所有数据的总个数。
		name = ObjectUtils.isEmpty(name)?name:"%"+name+"%";
		int total = regionDao.statisticCount(name);
		page.setTotal(total);
		List<Region> list = regionDao.findByCondition((pageNum-1)*pageSize,pageSize,name);
		page.setDatas(list);
		return page;
	}

	@Override
	public PageInfo<Region> findByPageHelper(int pageNum, int pageSize, String name) {

		name = ObjectUtils.isEmpty(name)?name:"%"+name+"%";
		PageHelper.startPage(pageNum, pageSize);
		List<Region> list = regionDao.findByNameLike(name); //按照名字模糊查找
		System.out.println("list --- >"+list);
		System.out.println("list 所属类型："+list.getClass());
		return new PageInfo<>(list);
	}

	@Override
	public List<Region> findAll() {
		// TODO Auto-generated method stub
		return regionDao.findAll();
	}

	
}
